//
// AsioDeviceAdapter.cpp for AsioDeviceAdapter in /home/mambou_j//babel-2014
// 
// Made by jacquesquentin mamboumouafo
// Login   <mambou_j@epitech.net>
// 
// Started on  Mon May 14 20:57:06 2012 jacquesquentin mamboumouafo
// Last update Wed May 16 16:53:06 2012 jacquesquentin mamboumouafo
//


#include	"AsioDeviceAdapter.hpp"
#include	"portaudio.h"
#include	"pa_asio.h"
#include	"Device.hpp"
#include	"HostApi.hpp"
#include	"Exception.hpp"


namespace	portaudio
{
  AsioDeviceAdapter::AsioDeviceAdapter(Device &device)
  {
    if (device.hostApi().typeId() != paASIO)
      throw PaCppException(PaCppException::UNABLE_TO_ADAPT_DEVICE);

  device_ = &device;

  PaError err = PaAsio_GetAvailableLatencyValues(device_->index(), &minBufferSize_, &maxBufferSize_, &preferenceBufferSize_, &granulity_);

  if (err != paError)
    throw PaException(err);
  }

  Device	&AsioDeviceAdapter::device()
  {
    return *device_;
  }

  long	AsioDeviceAdapter::minBufferSize() const
  {
    return minBufferSize_;
  }

  long	AsioDeviceAdapter::maxBufferSize() const
  {
    return maxBufferSize_;
  }

  long	AsioDeviceAdapter::preferredBufferSize() const
  {
    return preferredBufferSize_;
  }

  long	AsioDeviceAdapter::granularity() const
  {
    return granularity_;
  }

  void	AsioDeviceAdapter::showControlPanel(void *systemSpecific)
  {
    PaError	err = PaAsio_ShowControlPanel(device_->index(), systemSpecific);

    if (err != paNoError)
      throw PaException(err);
  }

  const	char *AsioDeviceAdapter::inputChannelName(int channelIndex) const
  {
    const	char *channelName;
    PaError	err = PaAsio_GetInputChannelName(device_->index(), channelIndex, &channelName);

    if (err != paNoError)
      throw PaException(err);

    return channelName;
  }

  const	char *AsioDeviceAdapter::outputChannelName(int channelIndex) const
  {
    const	char *channelName;
    PaError	err = PaAsio_GetOutputChannelName(device_->index(), channelIndex, &channelName);

    if (err != paNoError)
      throw PaException(err);

    return channelName;
  }
}
